#include <stdio.h>
#include <stdlib.h>

typedef int ElemSet; /* 默认元素为整数*/
#define Swap(x, y) { ElemSet t = x; x = y; y = t; }

/* 算法10-6：序列拆分 Partition(a,l,r) */
int Partition(ElemSet *a, int l, int r) {
    int i, j;
    ElemSet p;

    i = l;
    j = r - 1;
    p = a[r]; /* 选择序列最后一个元素作为轴点 */
    while (1) {
        while (a[i] < p) { /* 找到i以右第一个大于等于轴点的元素 */
            i++;
        }
        while (a[j] > p
                && j > l) { /* 找到j以前第一个小于等于轴点的元素 */
            j--;
        }
        if (i >= j) { /* 如果i大于等于j，完成拆分，退出循环 */
            break;
        }
        Swap(a[i], a[j]); /* 交换a[i]和a[j]并右移i左移j */
        i++;
        j--;
    }
    Swap(a[i], a[r]); /* 此时{a[l], ..., a[i-1]}<=a[i]<={a[i+1], ..., a[r]}*/
    return i;
}
/* 算法10-6 结束 */

/* 算法10-7：快速排序 QuickSort(a,l,r) */
void QuickSort(ElemSet *a, int l, int r) {
    int i;

    if (l < r) { /* 超过1个元素才进行排序 */
        i = Partition(a, l, r);
        QuickSort(a, l, i - 1);
        QuickSort(a, i + 1, r);
    }
}
/* 算法10-7 结束 */

int main(void) {
    ElemSet *a; /* 数组a的下标从0开始 */
    int n, i;

    scanf("%d", &n);
    a = (ElemSet *)malloc(sizeof(ElemSet) * n);
    for (i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }
    QuickSort(a, 0, n - 1);
    for (i = 0; i < n; i++) {
        printf("%d ", a[i]);
    }

    return 0;
}